package com.yihusitian.leecode.algorithm.easy;

import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 给定两个数组，编写一个函数来计算它们的交集。
 * 输出结果中的每个元素一定是唯一的。
 * 我们可以不考虑输出结果的顺序。
 *
 */
public class IntersectionOfTwoArrays {

    public int[] intersection(int[] nums1, int[] nums2) {
        if (Objects.isNull(nums1) || Objects.isNull(nums2) || nums1.length == 0 || nums2.length == 0) {
            return nums1;
        }
        //保证nums1的长度大于nums2的长度
        if (nums1.length < nums2.length) {
            int[] tempnums = nums1;
            nums1 = nums2;
            nums2 = tempnums;
        }
        Set<Integer> set = new HashSet<>();
        for (int i = 0; i < nums2.length; i++) {
            for (int j = 0; j < nums1.length; j++) {
                if (nums1[j] == nums2[i]) {
                    set.add(nums1[j]);
                    break;
                }
            }
        }

        int[] result = new int[set.size()];
        int i = 0;
        for (int num : set) {
            result[i] = num;
            i++;
        }
        return result;
    }

    public int[] intersection1(int[] nums1, int[] nums2) {
        if (Objects.isNull(nums1) || Objects.isNull(nums2) || nums1.length == 0 || nums2.length == 0) {
            return nums1;
        }
        Set<Integer> set = new HashSet<>();
        Arrays.stream(nums1).forEach(item -> set.add(item));
        Set<Integer> intersection = new HashSet<>();

        for (int i = 0; i < nums2.length; i++) {
            if (set.contains(nums2[i])) {
                intersection.add(nums2[i]);
            }
        }

        int[] result = new int[intersection.size()];
        int i = 0;
        for (int num : intersection) {
            result[i] = num;
            i++;
        }
        return result;
    }

    public static void main(String[] args) {
        int[] nums1 = new int[]{1,2,3,8,1,2};
        int[] nums2 = new int[]{1,2,3,5,6,8,9};
        Arrays.stream(new IntersectionOfTwoArrays().intersection1(nums2, nums1)).forEach(System.out::println);
    }
}
